home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / docs / misc / amigapl.9903.lzh / amigapl.9903 / pci.lzx / Examples / listpci.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-14  |  11.5 KB  |  304 lines

  1. /* listpci.c - list all configured PCI cards in the system */
  2. /* build using SAS C v 6.58                                */
  3. /* sc link listpci                                         */
  4.  
  5. #include <exec/libraries.h>
  6. #include <clib/exec_protos.h>
  7.  
  8. #include <libraries/pciexpansionbase.h>
  9. #include <clib/pciexpansion_protos.h>
  10. #include <pragmas/pciexpansion_pragmas.h>
  11.  
  12. #include <stdio.h>
  13.  
  14.  
  15. extern struct PCIExpBase * PCIExpansionBase = NULL;
  16.  
  17. char __stdiowin[]="CON:0/10/620/240/list pci";
  18. char __stdiov37[]="/CLOSE/WAIT";
  19.  
  20.  
  21.  
  22.  
  23. /* selction criteria to list operation */
  24. /* add/remove items to change criteria */
  25. /* example:
  26.      {PCIE_VENDORID, 0x5333}, - S3 Incorporated 'S' = 0x53, '3' = 0x33 :)))
  27.      {PCIE_BASECLASSCODE, 0x3},
  28. */
  29. struct TagItem tags[] = {
  30.                            {TAG_DONE, 0 } 
  31.                         };
  32.  
  33.  
  34. /* abbr. of card sizes */
  35. char * sizes[] = { " 1 byte ", " 2 bytes ", " 4 bytes ", " 8 bytes ", 
  36.                    " 16 bytes ", " 32 bytes ", " 64 bytes ", " 128 bytes ", 
  37.                    " 256 bytes ", " 512 bytes ", " 1 KB ", " 2 KB ", 
  38.                    " 4 KB ", " 8 KB ", " 16 KB ", " 32 KB ", 
  39.                    " 64 KB ", " 128 KB ", " 256 KB ", " 512 KB ", 
  40.                    " 1 MB ", " 2 MB ", " 4 MB ", " 8 MB ", 
  41.                    " 16 MB ", " 32 MB ", " 64 MB ", " 128 MB ", 
  42.                    " 256 MB ", " 512 MB ", " 1 GB ", " 2 GB ", 
  43.                    " 4 GB " };
  44.  
  45.  
  46. /* separated function to recognize card type */
  47. /* - a lot of switch'es                      */
  48. void type_recognize(struct pci_class * class_reg)
  49. {
  50.    switch (class_reg->base)
  51.    {
  52.        case 0x00: /* old style device                    */
  53.                   /* built before Class Code definitions */
  54.                   /* were finalized                      */
  55.                   printf("old style device : ");
  56.                   switch (class_reg->sub)
  57.                   {
  58.                      case 0x1: /* VGA-compabible device */
  59.                                printf("VGA-compatible device");
  60.                                break;
  61.                      case 0x0: /* all devices except VGAs */
  62.                                printf("no VGA device");
  63.                                break;
  64.                      default:  printf("undefined");
  65.                                break;
  66.                   }
  67.                   break;
  68.        case 0x01: printf("mass storage controller : ");
  69.                   switch (class_reg->sub)
  70.                   {
  71.                      case 0x00: printf("SCSI bus controller");
  72.                                 break;
  73.                      case 0x01: printf("IDE bus controller");
  74.                                 break;
  75.                      case 0x02: printf("Floppy disk controller");
  76.                                 break;
  77.                      case 0x03: printf("IPI bus controller");
  78.                                 break;
  79.                      case 0x04: printf("RAID controller");
  80.                                 break;
  81.                      case 0x80: printf("other");
  82.                                 break;
  83.                      default:   printf("undefined");
  84.                                 break;
  85.                   }
  86.                   break;
  87.        case 0x02: printf("Network controller : ");
  88.                   switch (class_reg->sub)
  89.                   {
  90.                      case 0x00: printf("Ethernet controller");
  91.                                 break;
  92.                      case 0x01: printf("Token Ring controller");
  93.                                 break;
  94.                      case 0x02: printf("FDDI controller");
  95.                                 break;
  96.                      case 0x03: printf("ATM controller");
  97.                                 break;
  98.                      case 0x80: printf("other");
  99.                                 break;
  100.                      default:   printf("undefined");
  101.                                 break;
  102.                   }
  103.                   break;
  104.        case 0x03: switch (class_reg->sub)
  105.                   {
  106.                      case 0x00: if (class_reg->prog==0)
  107.                                    printf("VGA compatible");
  108.                                 else
  109.                                    printf("8514 compatible");
  110.                                 break;
  111.                      case 0x01: printf("XGA controller");
  112.                                 break;
  113.                      case 0x80: printf("other");
  114.                                 break;
  115.                      default:   printf("undefined");
  116.                                 break;
  117.                   }
  118.                   printf(" display controller");
  119.                   break;
  120.        case 0x04: switch (class_reg->sub)
  121.                   {
  122.                      case 0x00: printf("Video");
  123.                                 break;
  124.                      case 0x01: printf("Audio");
  125.                                 break;
  126.                      case 0x80: printf("other");
  127.                                 break;
  128.                      default:   printf("undefined");
  129.                                 break;
  130.                   }
  131.                   printf(" multimedia device");
  132.                   break;
  133.        case 0x05: switch (class_reg->sub)
  134.                   {
  135.                      case 0x00: printf("RAM ");
  136.                                 break;
  137.                      case 0x01: printf("Flash ");
  138.                                 break;
  139.                      case 0x80: printf("other ");
  140.                                 break;
  141.                      default:   printf("undefined ");
  142.                                 break;
  143.                   }
  144.                   printf("memory controller");
  145.                   break;
  146.        case 0x06: switch (class_reg->sub)
  147.                   {
  148.                      case 0x00: printf("Host");
  149.                                 break;
  150.                      case 0x01: printf("ISA");
  151.                                 break;
  152.                      case 0x02: printf("EISA");
  153.                                 break;
  154.                      case 0x03: printf("MCA");
  155.                                 break;
  156.                      case 0x04: printf("PCI-to-PCI");
  157.                                 break;
  158.                      case 0x05: printf("PCMCIA");
  159.                                 break;
  160.                      case 0x06: printf("NuBus");
  161.                                 break;
  162.                      case 0x07: printf("CardBus");
  163.                                 break;
  164.                      case 0x80: printf("other");
  165.                                 break;
  166.                      default:   printf("undefined");
  167.                                 break;
  168.                   }
  169.                   printf(" bridge device");
  170.                   break;
  171.        case 0x07: printf("Simple ");
  172.                   switch (class_reg->sub)
  173.                   {
  174.                      case 0x00: printf("serial");
  175.                                 break;
  176.                      case 0x01: printf("paraller");
  177.                                 break;
  178.                      case 0x80: printf("other");
  179.                                 break;
  180.                      default:  printf("undefined");
  181.                                break;
  182.                   }
  183.                   printf(" communication controller");
  184.                   break;
  185.        case 0x08: printf(" PC base system pripherials"); 
  186.                   break;
  187.        case 0x09: printf("Input device : ");
  188.                   switch (class_reg->sub)
  189.                   {
  190.                      case 0x00: printf("keyboard controller");
  191.                                 break;
  192.                      case 0x01: printf("Digitizer (pen)");
  193.                                 break;
  194.                      case 0x02: printf("Mouse controller");
  195.                                 break;
  196.                      case 0x80: printf("other");
  197.                                 break;
  198.                      default:   printf("undefined");
  199.                                 break;
  200.                   }
  201.                   break;
  202.        case 0x0A: printf("docking station ");
  203.        case 0x0B: switch (class_reg->sub)
  204.                   {
  205.                      case 0x00: printf("386 ");
  206.                                 break;
  207.                      case 0x01: printf("486 ");
  208.                                 break;
  209.                      case 0x02: printf("Pentium ");
  210.                                 break;
  211.                      case 0x10: printf("Alpha ");
  212.                                 break;
  213.                      case 0x20: printf("PowerPC ");
  214.                                 break;
  215.                      case 0x40: printf("Co-");
  216.                                 break;
  217.                      default:   printf("undefined ");
  218.                                 break;
  219.                   }
  220.                   printf("processor");
  221.                   break;
  222.        case 0x0C: /* Serial bus controllers           */
  223.                   switch (class_reg->sub)
  224.                   {
  225.                      case 0x00: printf("FireWire (IEEE 1394) ");
  226.                                 break;
  227.                      case 0x01: printf("ACCESS.bus.");
  228.                                 break;
  229.                      case 0x02: printf("SSA ");
  230.                                 break;
  231.                      case 0x03: printf("USB ");
  232.                                 break;
  233.                      case 0x04: printf("Fibre Channel ");
  234.                                 break;
  235.                      default:   printf("undefined ");
  236.                                 break;
  237.                   }
  238.                   printf("serial bus controller");
  239.                   break;
  240.        case 0xFF: printf("Device does not fit in any defined classes");
  241.                   break;
  242.    }
  243. }
  244.  
  245.  
  246. int main(int argc, char * argv[])
  247. {
  248.   struct PCIConfDev * pcidev = NULL;
  249.   int a;
  250.   ULONG adr;
  251.     
  252.   PCIExpansionBase = (struct PCIExpBase *)OpenLibrary(PCIEXPANSIONNAME,0L);
  253.   if (PCIExpansionBase)
  254.   {
  255.     while (pcidev = FindPCIDev(pcidev,tags))
  256.     {
  257.         /* print out card information */
  258.         /* VENDOR, DEVICE             */
  259.         printf("PCI card in slot no %2d : ",pcidev->SlotNo);
  260.         printf("Vendor ID = %04X, Device ID = %04X\n", pcidev->Config.pcie_id.vid,
  261.                                              pcidev->Config.pcie_id.did);
  262.         /* device type(class)         */
  263.         printf("    Device type     : ");
  264.         type_recognize(&pcidev->Config.pcie_class);
  265.         printf("\n");
  266.         for (a = 0; a<6; a++)
  267.         {
  268.             adr = pcidev->Config.pcie_baddr[a].valUlong;
  269.             if (adr)
  270.             {
  271.                printf("    Card addr. no %d = 0x%08X", a, adr & 0xFFFFFFF0);
  272.                if (pcidev->Config.pcie_baddr[a].pcie_mem_addr.space)
  273.                   printf(" in IO space");
  274.                else
  275.                   printf(" in MEMORY space");
  276.                printf(" uses %s \n", sizes[pcidev->Size[a]]);
  277.             }
  278.         }
  279.         if (pcidev->Config.pcie_rom_addr.bits.ena)
  280.         {
  281.            printf("    Rom address     = 0x%08X in MEMORY space", pcidev->Config.pcie_rom_addr.valUlong & 0xFFFFFFF0);
  282.            printf(" uses %s \n", sizes[pcidev->Size[6]]);
  283.         }
  284.         else
  285.            printf("    No ROM\n");
  286.         if (pcidev->Config.pcie_misc1.int_pin)
  287.         {
  288.             printf("    Device uses INT%c# interrupt line",
  289.                         pcidev->Config.pcie_misc1.int_pin+'@');
  290.            if (pcidev->Config.pcie_misc1.int_line)
  291.                printf(" use AddIntServer(%d,...) \n", pcidev->Config.pcie_misc1.int_line);
  292.            else
  293.                printf(" not connected to CPU\n");
  294.         }
  295.         else
  296.            printf("    Device does not use interrupts\n");
  297.     } 
  298.     CloseLibrary((struct Library *)PCIExpansionBase);
  299.   }
  300.   else
  301.     printf("Unable to open pciexpansion.library\n");
  302. }
  303.  
  304.